// server/middleware/auth.ts
import jwt from 'jsonwebtoken'
import { getCookie, deleteCookie, createError, defineEventHandler } from 'h3'

function isApiPath(str: string) {
  return typeof str === 'string' && str.startsWith('/api')
}

export default defineEventHandler((event) => {
  // 1. 定义白名单路径
  const whiteList = [
    '/',
    '/my-music',
    '/login',
    '/api/db-test',
    '/api/navigation',
    '/api/music-list',
    '/api/user-info',
    '/api/login', // 登录接口
    '/api/register', // 注册接口
    '/api/refresh-token', // 刷新token接口
    '/api/public/*', // 所有公共接口（通配符）
    '/api/health-check' // 健康检查接口
  ]

  // 2. 获取当前请求路径
  const { pathname } = new URL(event.node.req.url!, 'http://localhost')
  // 3. 检查路径是否在白名单中
  const isInWhiteList = whiteList.some((pattern) => {
    // 处理通配符（如 '/api/public/*' 匹配所有子路径）
    if (pattern.endsWith('*')) {
      const basePath = pattern.slice(0, -1) // 移除末尾的 '*'
      return pathname.startsWith(basePath)
    }
    // 精确匹配
    return pathname === pattern
  })

  // 4. 白名单路径直接放行
  if (isApiPath(pathname) && isInWhiteList) {
    return
  }

  // 5. 非白名单路径：执行Token验证逻辑
  const token = getCookie(event, 'accessToken')

  // 6. 验证Token有效性
  if (!token) {
    return
  }
  try {
    const decoded = jwt.verify(
      token,
      process.env.JWT_SECRET || 'your-secret-key'
    )

    // 7. Token有效：添加到请求头（供后续接口使用）
    const authHeader = event.node.req.headers.authorization
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      event.node.req.headers.authorization = `Bearer ${token.trim()}`
    }

    // 将解码后的用户信息添加到请求上下文中
    event.context.user = decoded
  } catch (error) {
    // Token无效或过期
    deleteCookie(event, 'accessToken')

    throw createError({
      statusCode: 401,
      statusMessage: 'Unauthorized',
      message: '未授权访问：Token无效或已过期，请重新登录'
    })
  }
})
